﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Common;
using System.Linq;
using System.Text;
using Microsoft.Practices.EnterpriseLibrary.Data.Oracle;
using System.Data;

using Entity = SinacorWebTools.Entity;
using SinacorWebTools.Entity;

namespace SinacorWebTools.ResourceAccess
{
    public class Funcao : DataAccess
    {
        public Entity.Funcao SelecionaFuncaoPorDireitoAcesso(int codigoDireitoAcesso)
        {
            Entity.Funcao funcao = null;

            conn = CreateConnection();

            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT
                                        FCAO.COD_FCAO_SINACOR_MAIS,  
                                        FCAO.TXT_SIGL_FCAO_SINACOR_MAIS,
                                        FCAO.DESC_FCAO_SINACOR_MAIS
                                    FROM
                                        TGSFCAO_SINACOR_MAIS FCAO INNER JOIN TGSMOD
                                        ON FCAO.COD_MOD = TGSMOD.COD_MOD
                                        LEFT JOIN TFWDIREITO DIREITO
                                        ON FCAO.COD_FCAO_SINACOR_MAIS = DIREITO.COD_FCAO_SINACOR_MAIS
                                    WHERE DIREITO.COD_DIREITO = " + codigoDireitoAcesso;
                conn.Open();

                using (IDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        funcao = new Entity.Funcao(Convert.ToInt32(dr["COD_FCAO_SINACOR_MAIS"]),
                                                   dr["TXT_SIGL_FCAO_SINACOR_MAIS"].ToString(),
                                                   dr["DESC_FCAO_SINACOR_MAIS"].ToString());
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return funcao;
        }

        public Entity.Funcao SelecionaFuncaoPorMenu(string siglaFuncao)
        {
            Entity.Funcao funcao = null;
            conn = CreateConnection();
            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT  FCAO.COD_FCAO_SINACOR_MAIS,  
                                            FCAO.TXT_SIGL_FCAO_SINACOR_MAIS,
                                            FCAO.DESC_FCAO_SINACOR_MAIS
                                    FROM    TGSFCAO_SINACOR_MAIS FCAO INNER JOIN TFWMENU MENU
                                            ON TRIM(FCAO.TXT_SIGL_FCAO_SINACOR_MAIS) = TRIM(MENU.CD_FUNCAO)
                                    WHERE   TRIM(MENU.CD_FUNCAO) = '" + siglaFuncao + "'";
                conn.Open();

                using (IDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                        funcao = new Entity.Funcao(Convert.ToInt32(dr["COD_FCAO_SINACOR_MAIS"]),
                                                   dr["TXT_SIGL_FCAO_SINACOR_MAIS"].ToString(),
                                                   dr["DESC_FCAO_SINACOR_MAIS"].ToString());
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }

            return funcao;
        }

        public SortableList<Entity.Funcao> ListaFuncoes(int codigo,
                                                string pesquisa,
                                                string modulo)
        {
            SortableList<Entity.Funcao> funcoes = new SortableList<Entity.Funcao>();
            conn = CreateConnection();
            try
            {
                DbCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT
                                        FCAO.COD_FCAO_SINACOR_MAIS,  
                                        FCAO.TXT_SIGL_FCAO_SINACOR_MAIS,
                                        FCAO.DESC_FCAO_SINACOR_MAIS
                                    FROM
                                        TGSFCAO_SINACOR_MAIS FCAO INNER JOIN TGSMOD
                                        ON FCAO.COD_MOD = TGSMOD.COD_MOD
                                        LEFT JOIN TFWDIREITO DIREITO
                                        ON FCAO.COD_FCAO_SINACOR_MAIS = DIREITO.COD_FCAO_SINACOR_MAIS ";

                if (codigo > 0)
                    cmd.CommandText += "WHERE FCAO.COD_FCAO_SINACOR_MAIS = '" + codigo + "'";

                if (modulo.Length > 0)
                {
                    if (cmd.CommandText.IndexOf("WHERE") > 0)
                        cmd.CommandText += " AND";
                    else
                        cmd.CommandText += " WHERE";

                    cmd.CommandText += " UPPER(TGSMOD.TXT_SIGL_MOD) = '" + modulo.ToUpper() + "'";
                }

                if (pesquisa.Length > 0)
                {
                    if (cmd.CommandText.IndexOf("TXT_SIGL_MOD") > 0)
                        cmd.CommandText += " AND";
                    else
                        cmd.CommandText += " WHERE";

                    cmd.CommandText += " UPPER(FCAO.DESC_FCAO_SINACOR_MAIS) LIKE '%" + pesquisa.ToUpper() + "%'";
                    cmd.CommandText += " OR UPPER(FCAO.TXT_SIGL_FCAO_SINACOR_MAIS) LIKE '%" + pesquisa.ToUpper() + "%'";
                }

                cmd.CommandText += " ORDER BY FCAO.TXT_SIGL_FCAO_SINACOR_MAIS";
                conn.Open();

                List<IDataRecord> records = (from IDataRecord r in cmd.ExecuteReader()
                                             select r).ToList();

                funcoes = MapDataToBusinessEntityCollection<Entity.Funcao>(records);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (conn.State != ConnectionState.Closed)
                    conn.Close();
            }
            return funcoes;
        }
    }
}
